package com.switz.agendacita.persistence;

import com.switz.agendacita.dto.Agenda;
import com.switz.agendacita.dto.Empresa;
import com.switz.agendacita.dto.EmpresaPersonal;
import com.switz.agendacita.dto.Servicio;
import com.switz.agendacita.dto.TiposEmpresa;
import com.switz.agendacita.dto.Usuario;
import com.switz.agendacita.persistence.iface.EmpresaDao;
import com.switz.agendacita.vo.ReservacionPendiente;
import com.switz.agendacita.vo.ReservacionSeleccionada;
import com.switz.agendacita.vo.ServiciosEmpresa;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class EmpresaDaoImpl extends JdbcDaoSupport implements EmpresaDao {

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Autowired
    public EmpresaDaoImpl(DataSource dataSource) {

        setDataSource(dataSource);
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
                dataSource);
    }

    /*
     * String sql = "select nombre,direccion from empresa"; List empresas =
     * getJdbcTemplate().query(sql, new ParameterizedRowMapper<Empresa>(){
     * public Empresa mapRow(ResultSet rs, int rowNum) throws SQLException {
     * Empresa empresa = new
     * Empresa(rs.getString("nombre"),rs.getString("direccion")); //
     * return empresa; }
     * 
     * 
     * });
     */
   
    @Override
    public List getServiciosPorEmpresa(String idEmpresa) {
        String query = "select servicios.id as idServicio,? as idEmpresa, servicios.descripcion, "
                + "empresaservicios.costo,empresaservicios.tiempo from servicios inner join "
                + "empresaservicios on servicios.id=empresaservicios.idservicio"
                + " where empresaservicios.idempresa=?";
        List servicios = getJdbcTemplate().query(query, new Object[]{idEmpresa,idEmpresa},
                ParameterizedBeanPropertyRowMapper.newInstance(ServiciosEmpresa.class));
        return servicios;
    }

    @Override
    public void insertEmpresa(Empresa empresa) {

        SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(
                getJdbcTemplate().getDataSource())
                .withTableName("empresas");
        SqlParameterSource parameters = new BeanPropertySqlParameterSource(empresa);

        simpleJdbcInsert.execute(parameters);

    }

    @Override
    public void updateEmpresa(Empresa empresa) {
        String query = "UPDATE empresas SET nombre =:nombre,direccion=:direccion,municipio=:municipio,estado=:estado,pais=:pais,cp=:cp,telefono =:telefono,movil =:movil,mail=:mail,url=:url,diashorarios=:diashorarios,imagen=:imagen,latitud=:latitud,longitud=:longitud,descripcion=:descripcion,tags=:tags WHERE id=:id";
        SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(empresa);

        namedParameterJdbcTemplate.update(query, parameterSource);

    }

    @Override
    public List getEmprasaTipos(String idEmpresa) {
        String query = "select tiposempresa.id, tiposempresa.descripcion from tiposempresa inner join "
                + "empresatipo on tiposempresa.id=empresatipo.idtipoempresa"
                + " where empresatipo.idempresa=?";
        List tipos = getJdbcTemplate().query(query, new Object[]{idEmpresa},
                ParameterizedBeanPropertyRowMapper.newInstance(TiposEmpresa.class));
        return tipos;
    }

    @Override
    public List getCatalogoServiciosPorEmpresa(String[] idTipoEmpresa) {
        String parametros = "";

        for (int i = 0; i < idTipoEmpresa.length; i++) {
            if (i == (idTipoEmpresa.length - 1)) {
                parametros = parametros + (idTipoEmpresa[i]);
            } else {
                parametros = parametros + (idTipoEmpresa[i]) + ",";
            }

        }

        String query = "SELECT DISTINCT servicios.* FROM servicios INNER JOIN "
                + "tipoempresaservicios ON servicios.id=tipoempresaservicios.idservicio"
                + " WHERE tipoempresaservicios.idtipoempresa IN (" + parametros + ")";

        List servicios = getJdbcTemplate().query(query, new Object[]{},
                ParameterizedBeanPropertyRowMapper.newInstance(Servicio.class));
        return servicios;
    }

    @Override
    public List getReservacionesPendientesPorEmpresa(String idEmpresa) {

        String query = " select empresas.nombre, servicios.descripcion, "
                + "usuario.nombre, personal.nombre, agenda.fecha, agenda.inicio"
                + " from empresas, servicios, usuarios as usuario, usuarios as personal, agenda"
                + " where empresas.id=agenda.idempresa and"
                + " servicios.id=agenda.idservicio and "
                + " usuario.id=agenda.idusuario and "
                + " personal.id=agenda.idpersonal and "
                + "agenda.idempresa=? and "
                + "agenda.fecha > DATE_FORMAT(NOW(),'%Y-%m-%d')";


        List reservacionesPendientes =
                getJdbcTemplate().query(query, new Object[]{idEmpresa}, new ParameterizedRowMapper<ReservacionPendiente>() {
            public ReservacionPendiente mapRow(ResultSet rs, int rowNum) throws SQLException {
                ReservacionPendiente reservacionPendiente = new ReservacionPendiente();
                reservacionPendiente.setFecha(rs.getDate("fecha"));
                reservacionPendiente.setHoraInicio(rs.getTime("agenda.inicio"));
                reservacionPendiente.setNombrePersonal(rs.getString("personal.nombre"));
                reservacionPendiente.setNombreUsuario(rs.getString("usuario.nombre"));
                reservacionPendiente.setNombreEmpresa(rs.getString("empresas.nombre"));
                reservacionPendiente.setDescripcionServicio(rs.getString("servicios.descripcion"));
                return reservacionPendiente;
            }
        });
        return reservacionesPendientes;
    }

    @Override
    public ReservacionSeleccionada getReservacionSeleccionada(String idReservacion) {
        String query = " select usuario.nombre, usuario.mail, usuario.telefono, "
                + "usuario.movil, personal.nombre, servicios.descripcion, "
                + "agenda.inicio, agenda.fin, agenda.fecha "
                + " from servicios, usuarios as usuario, usuarios as personal, agenda "
                + " where servicios.id=agenda.idservicio and "
                + " usuario.id=agenda.idusuario and "
                + " personal.id=agenda.idpersonal and "
                + "agenda.id=? ";

        ReservacionSeleccionada reservacionSeleccinada = getJdbcTemplate().queryForObject(query,
                new Object[]{idReservacion}, new RowMapper<ReservacionSeleccionada>() {
            @Override
            public ReservacionSeleccionada mapRow(ResultSet rs, int i) throws SQLException {
                ReservacionSeleccionada datos = new ReservacionSeleccionada();
                datos.setNombreUsuario(rs.getString("usuario.nombre"));
                datos.setMail(rs.getString("usuario.mail"));
                datos.setTelefono(rs.getString("usuario.telefono"));
                datos.setMovil(rs.getString("usuario.movil"));
                datos.setNombrePersonal(rs.getString("personal.nombre"));
                datos.setDescripcionServicio(rs.getString("servicios.descripcion"));
                datos.setFecha(rs.getDate("fecha"));
                datos.setHoraInicio(rs.getTime("agenda.inicio"));
                datos.setHoraFin(rs.getTime("agenda.fin"));
                return datos;
            }
        });


        return reservacionSeleccinada;
    }

    @Override
    public Empresa getEmpresa(String mail, String pws) {
        String query = "SELECT id, nombre FROM empresas WHERE mail=? AND psw=?";

        List listaEmpresa = getJdbcTemplate().query(query, new Object[]{mail, pws},
                ParameterizedBeanPropertyRowMapper.newInstance(Empresa.class));
        Empresa empresa = listaEmpresa.size() > 0 ? (Empresa) listaEmpresa.get(0) : null;

        return empresa;
    }

    @Override
    public Usuario getUsuario(String mail, String pws, int tipoUsuario) {
        String query = "SELECT * FROM usuarios WHERE  mail=? AND psw=? AND tipousuario=? AND status=1";

        List listaUsuario = getJdbcTemplate().query(query, new Object[]{mail, pws, tipoUsuario},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        Usuario usuario = listaUsuario.size() > 0 ? (Usuario) listaUsuario.get(0) : null;

        return usuario;
    }

    @Override
    public void insertEmpresaPersonal(EmpresaPersonal empresaPersonal) {

        SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(
                getJdbcTemplate().getDataSource()).withTableName("empresapersonal");
        SqlParameterSource parameters = new BeanPropertySqlParameterSource(
                empresaPersonal);

        simpleJdbcInsert.execute(parameters);

    }

  	@Override
	public List getCatalogoSugerenciasServiciosPorEmpresa(String idEmpresa) {
		String query = "SELECT DISTINCT servicios.id as idServicio,'"+idEmpresa+"' as idEmpresa,servicios.descripcion, servicios.tiempo FROM servicios INNER JOIN "
                + "tipoempresaservicios ON servicios.id=tipoempresaservicios.idservicio"
                + " WHERE tipoempresaservicios.idtipoempresa IN "
                + "(SELECT idtipoempresa FROM empresatipo WHERE idempresa='"+idEmpresa+"') AND "
                + " tipoempresaservicios.idservicio not in (select idservicio from empresaservicios where idempresa='"+idEmpresa+"')";
//        List servicios = getJdbcTemplate().query(query, new Object[]{idEmpresa,idEmpresa},
//                ParameterizedBeanPropertyRowMapper.newInstance(Servicio.class));
//        return servicios;
//          return this.jdbcTemplate.queryForList(query);          
            return getJdbcTemplate().queryForList(query);
	}


    @Override
    public Empresa getEmpresaPorMail(String mail) {

        String query = "SELECT * FROM empresas WHERE mail=? ";




        List empresaList = getJdbcTemplate().query(query, new Object[]{mail}, new RowMapper<Empresa>() {
            @Override
            public Empresa mapRow(ResultSet rs, int i) throws SQLException {
                Empresa e = new Empresa();
                e.setId(rs.getString("id"));
                e.setNombre(rs.getString("nombre"));
                e.setDireccion(rs.getString("direccion"));
                e.setMunicipio(rs.getString("municipio"));
                e.setEstado(rs.getString("estado"));
                e.setPais(rs.getString("pais"));
                e.setCp(rs.getString("cp"));
                e.setTelefono(rs.getString("telefono"));
                e.setMovil(rs.getString("movil"));
                e.setMail(rs.getString("mail"));
                e.setUrl(rs.getString("url"));
                e.setDiasHorarios(rs.getString("diashorarios"));
                e.setImagen(rs.getString("imagen"));
                e.setLatitud(rs.getDouble("latitud"));
                e.setLongitud(rs.getDouble("longitud"));
                e.setDescripcion(rs.getString("descripcion"));
                e.setTags(rs.getString("tags"));
                e.setPsw(rs.getString("psw"));
                e.setConfirmarCitas(rs.getInt("confirmarcitas"));
                e.setStatus(rs.getInt("status"));
                return e;
            }
        });


        Empresa empresa = empresaList.size() > 0 ? (Empresa) empresaList.get(0) : null;
        
        return empresa;
    }

    @Override
    public List getPersonalPorEmpresa(String idEmpresa) {
        String query = "select usuarios.* "
                + " from usuarios inner join empresapersonal on usuarios.id=empresapersonal.idpersonal "
                + " where empresapersonal.idempresa=?";
        List personal = getJdbcTemplate().query(query, new Object[]{idEmpresa},
                ParameterizedBeanPropertyRowMapper.newInstance(Usuario.class));
        return personal;
    }

    @Override
    public Empresa getPsw(String idEmpresa) {
        String query = "SELECT id, psw FROM empresas WHERE id=? ";

        List listaEmpresa = getJdbcTemplate().query(query, new Object[]{idEmpresa},
                ParameterizedBeanPropertyRowMapper.newInstance(Empresa.class));
        Empresa empresa = listaEmpresa.size() > 0 ? (Empresa) listaEmpresa.get(0) : null;

        return empresa;
    }

    @Override
    public void updatePswEmpresa(String psw, String id) {
        String query = "UPDATE empresas SET psw =:psw WHERE id=:id";
        MapSqlParameterSource params = new MapSqlParameterSource();
        params.addValue("psw", psw);
        params.addValue("id", id);

        namedParameterJdbcTemplate.update(query, params);

    }

    @Override
    public Integer getConfirmarCitas(String idEmpresa) {
        String query = "SELECT confirmarcitas FROM empresas WHERE id=?";
        return getJdbcTemplate().queryForInt(query, new Object[]{idEmpresa});
    }

    @Override
    public void updateStatusEmpresa(String id) {
        String updateString = "UPDATE empresas SET status=1 WHERE id=:id";

        MapSqlParameterSource params = new MapSqlParameterSource();
        params.addValue("id", id);

        namedParameterJdbcTemplate.update(updateString, params);

    }

    @Override
    public Empresa getEmpresa(String id) {
        String query = "SELECT * FROM empresas WHERE id=?";

        List empresaList = getJdbcTemplate().query(query, new Object[]{id},
                ParameterizedBeanPropertyRowMapper.newInstance(Empresa.class));
        Empresa empresa = empresaList.size() > 0 ? (Empresa) empresaList.get(0) : null;

        return empresa;
    }
}
